// 认证状态管理Slice
// 负责管理用户登录、登出和认证状态
import { createSlice } from '@reduxjs/toolkit' // Redux Toolkit的slice创建函数
import type { PayloadAction } from '@reduxjs/toolkit' // 用于类型安全的action payload

// 用户信息接口定义
interface User {
  id: string // 用户ID
  name: string // 用户姓名
  email: string // 用户邮箱
}

// 认证状态接口定义
interface AuthState {
  user: User | null // 当前用户信息，null表示未登录
  token: string | null // 认证令牌，null表示无令牌
  isAuthenticated: boolean // 是否已认证
  loading: boolean // 是否正在加载（登录过程中）
}

// 初始状态：从localStorage中恢复认证状态
const initialState: AuthState = {
  user: null, // 初始无用户信息
  token: localStorage.getItem('token'), // 从localStorage获取token
  isAuthenticated: !!localStorage.getItem('token'), // 根据token判断是否已认证
  loading: false, // 初始不在加载状态
}

// 创建认证slice
const authSlice = createSlice({
  name: 'auth', // slice名称
  initialState, // 初始状态
  reducers: {
    // 开始登录：设置加载状态
    loginStart: (state) => {
      state.loading = true
    },
    // 登录成功：保存用户信息和token
    loginSuccess: (state, action: PayloadAction<{ user: User; token: string }>) => {
      state.loading = false // 结束加载状态
      state.isAuthenticated = true // 设置为已认证
      state.user = action.payload.user // 保存用户信息
      state.token = action.payload.token // 保存token
      localStorage.setItem('token', action.payload.token) // 将token保存到localStorage
    },
    // 登录失败：清除认证状态
    loginFailure: (state) => {
      state.loading = false // 结束加载状态
      state.isAuthenticated = false // 设置为未认证
      state.user = null // 清除用户信息
      state.token = null // 清除token
    },
    // 登出：清除所有认证信息
    logout: (state) => {
      state.user = null // 清除用户信息
      state.token = null // 清除token
      state.isAuthenticated = false // 设置为未认证
      localStorage.removeItem('token') // 从localStorage中移除token
    },
  },
})

// 导出actions供组件使用
export const { loginStart, loginSuccess, loginFailure, logout } = authSlice.actions
// 导出reducer供store使用
export default authSlice.reducer 